using System;
using System.Collections.Generic;
using ns26;
using ns27;
using Triton.Game.Mono;

namespace Triton.Game.Mapping
{
	[Attribute38("TwistingNetherSpell")]
	public class TwistingNetherSpell : SuperSpell
	{
		public enum VictimState
		{
			NONE,
			LIFTING,
			FLOATING,
			DRAINING,
			DEAD
		}

		[Attribute38("TwistingNetherSpell.Victim")]
		public class Victim : MonoClass
		{
			public VictimState m_state => method_2<VictimState>("m_state");

			public Card m_card => method_3<Card>("m_card");

			public Victim(IntPtr address, string className)
				: base(address, className)
			{
			}

			public Victim(IntPtr address)
				: this(address, "Victim")
			{
			}
		}

		public float m_FinishTime => method_2<float>("m_FinishTime");

		public TwistingNetherLiftInfo m_LiftInfo => method_3<TwistingNetherLiftInfo>("m_LiftInfo");

		public TwistingNetherFloatInfo m_FloatInfo => method_3<TwistingNetherFloatInfo>("m_FloatInfo");

		public TwistingNetherDrainInfo m_DrainInfo => method_3<TwistingNetherDrainInfo>("m_DrainInfo");

		public TwistingNetherSqueezeInfo m_SqueezeInfo => method_3<TwistingNetherSqueezeInfo>("m_SqueezeInfo");

		public static Vector3 DEAD_SCALE => MonoClass.smethod_6<Vector3>(TritonHs.MainAssemblyPath, "", "TwistingNetherSpell", "DEAD_SCALE");

		public List<Victim> m_victims => method_3<Class271<Victim>>("m_victims")?.method_25();

		public TwistingNetherSpell(IntPtr address, string className)
			: base(address, className)
		{
		}

		public TwistingNetherSpell(IntPtr address)
			: this(address, "TwistingNetherSpell")
		{
		}

		public new Card GetTargetCardFromPowerTask(int index, PowerTask task)
		{
			return method_14<Card>("GetTargetCardFromPowerTask", new object[2] { index, task });
		}

		public new void OnAction(SpellStateType prevStateType)
		{
			method_8("OnAction", prevStateType);
		}

		public new void CleanUp()
		{
			method_8("CleanUp");
		}

		public void Begin()
		{
			method_8("Begin");
		}

		public void Setup()
		{
			method_8("Setup");
		}

		public void Lift()
		{
			method_8("Lift");
		}

		public void OnLiftFinished(Victim victim)
		{
			method_8("OnLiftFinished", victim);
		}

		public void Float(Victim victim)
		{
			method_8("Float", victim);
		}

		public void OnFloatFinished(Victim victim)
		{
			method_8("OnFloatFinished", victim);
		}

		public void Drain(Victim victim)
		{
			method_8("Drain", victim);
		}

		public void OnDrainFinished(Victim victim)
		{
			method_8("OnDrainFinished", victim);
		}

		public void OnFinishTimeFinished()
		{
			method_8("OnFinishTimeFinished");
		}

		public void CleanUpVictim(Victim victim)
		{
			method_8("CleanUpVictim", victim);
		}

		public bool CanFinish()
		{
			return method_11<bool>("CanFinish", Array.Empty<object>());
		}
	}
}
